昨天延續了 lambda 的應用,介紹的 columns function,一個如其名一般的強大 的 function。
今天來特別介紹 columns function 的其他用法:
除了使用 lambda 函數,columns function 還支持使用 regex 來選擇列。這對於處理具有特定命名模式的col 特別有用。
SELECT COLUMNS('.*_dude$')
FROM community;
這個查詢會選擇所有以 '_dude' 結尾的列。
特定列的 aggregation:
SELECT max(COLUMNS('.*_dude$'))
FROM community;
所有以 '_dude' 結尾的列的最大值
我完全不知道在 Postgres 要怎麼辦到類似的事情,問了一下 chatGPT,原來要寫 Postgres 的 PL/pgSQL
生出模板 query 在執行,還算可以理解,但我覺得維護成本比起 columns function 高了一些。
DO $$
DECLARE
query text := 'SELECT ';
column_list text := '';
BEGIN
SELECT string_agg(column_name, ', ')
INTO column_list
FROM information_schema.columns
WHERE table_name = 'community'
AND column_name LIKE '%_dude';
IF column_list = '' THEN
RAISE NOTICE 'No columns ending with _dude found';
RETURN;
END IF;
query := query || column_list || ' FROM community';
EXECUTE query;
END $$;
選擇所有以 '_dude' 結尾的列。
DO $$
DECLARE
query text := 'SELECT ';
column_list text := '';
BEGIN
SELECT string_agg('MAX(' || column_name || ') AS max_' || column_name, ', ')
INTO column_list
FROM information_schema.columns
WHERE table_name = 'community'
AND column_name LIKE '%_dude';
IF column_list = '' THEN
RAISE NOTICE 'No columns ending with _dude found';
RETURN;
END IF;
query := query || column_list || ' FROM community';
EXECUTE query;
END $$;
所有以 '_dude' 結尾的列的最大值,字串拼貼成 query 在執行,我覺得讀起來複雜很多。
今天介紹了用 regex 選出很多 col,然後對這些 col 做同一種 aggregation,但 columns 還有其他進階的應用,我們明天繼續探討。